package com.atguigu.rabbitmq.one;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * 生产者：发消息
 */
public class Producer {

    // 队列名称
    public static final String QUEUE_NAME = "hello";

    // 发消息
    public static void main(String[] args)  {
        try {
            // 创建一个连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            // 设置工厂的ip,连接rabbitmq的队列
            factory.setHost("192.168.0.106");
            // 设置用户名
            factory.setUsername("admin");
            // 设置密码
            factory.setPassword("123");
            // 设置端口 ， 也可以不用设置 默认端口也是他
            // factory.setPort(5672);

            // 创建连接
            Connection connection = factory.newConnection();
            // 获取信道 channel
            Channel channel = connection.createChannel();
            /**
             * 生成一个队列
             * 1. 队列名称
             * 2. 队列里面的消息是否持久化（磁盘），默认情况信息存储在内存中
             * 3. (这个解释有问题可以后期测试看)该队列是否只供一个消费者消费，是否进行消息的共享，true 可以多个消费者消费，false就是不准
             * 4. 是否自动删除 最后一个消费责断开连接后 该对应是否自动删除，true自动删除，反只就不自动删除
             * 5。其他参数，暂时没用上
             */

            Map<String,Object> arguments = new HashMap<>();
            // 设置消费责 消息优先界别，官方文档时0-255，此处设置10 允许优化级别范围为0-10 不要设置过大 浪费pc和内存
            arguments.put("x-max-priority", 10);
            channel.queueDeclare(QUEUE_NAME,true,false,false,arguments);


            for (int i = 0 ; i < 10 ; i ++  ) {
                String message = "info"+i;
                if ( i == 5 ) {
                    // 设置消息发送优先级别
                    AMQP.BasicProperties properties =
                            new AMQP.BasicProperties().builder().priority(5).build();
                    /**
                     * 发送一个消息
                     * 1. 发送到哪一个交换机，本次为默认 不写
                     * 2. 路由的Key值是哪个，本次是队列的名称
                     * 3. 其他参数信息
                     * 4. 发送消息的消息体
                     */
                    // 发送消息
                    channel.basicPublish("",QUEUE_NAME,properties,message.getBytes());
                } else { // 正常发送消息不设置有限界别
                    // 发送消息
                    channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
                }
            }
            // String message = "hello world 第二次消费"; // 初次使用程序
            /**
             * 发送一个消息
             * 1. 发送到哪一个交换机，本次为默认 不写
             * 2. 路由的Key值是哪个，本次是队列的名称
             * 3. 其他参数信息
             * 4. 发送消息的消息体
             */
            // 发送消息
            //channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
            System.out.println("消息发送完毕");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}
